package com.allwees.bs.module.pms.req;

import com.neovisionaries.i18n.CurrencyCode;
import com.allwees.bs.core.modelbase.req.BoCrudReq;
import com.allwees.bs.core.modelbase.validate.ValidateItem;
import com.allwees.bs.module.pms.entity.Product;
import com.allwees.core.common.util.MoneyUtil;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.StringUtils;

import java.math.BigDecimal;
import java.util.List;

/**
 * 平台补全Product信息
 *
 * @author yangylsky
 * @since 2019-12-18
 *
 */
@Data
@EqualsAndHashCode(callSuper = true)
public class CompletionProductReq extends BoCrudReq<Product> {
	private List<SkuReq> skus;

	@Override
	public ValidateItem[] getValidateItems() {
		return ArrayUtils.addAll(
				new ValidateItem[] {
						new ValidateItem(bo == null, "商品不能为空"),
						new ValidateItem(!StringUtils.isBlank(bo.getUuid()), "商品uuid不能为空"),
						new ValidateItem(CollectionUtils.isEmpty(skus), "商品关联的sku不能为空"),
						new ValidateItem(null == CurrencyCode.getByCodeIgnoreCase(bo.getCurrency()), "商品零售价币种不合法")
//						new ValidateItem(!isValidSaleLangs(bo.saleLangs()), "商品发布语言不合法"),
//						new ValidateItem(!isValidSaleRegions(bo.saleRegions()), "商品销售区域不合法")
					},
				getSkuValidateItems()
			);
	}

	private ValidateItem[] getSkuValidateItems() {
		ValidateItem[] validateItems = new ValidateItem[0];
		for(SkuReq skuReq : skus) {
			validateItems = ArrayUtils.addAll(validateItems,
					new ValidateItem(!StringUtils.isBlank(skuReq.getUuid()), "SKU uuid不能为空"),
					new ValidateItem(skuReq.getOriginalPrice() == null, "SKU零售原价不合法"),
					new ValidateItem(skuReq.getRetailPrice() == null, "SKU零售价不合法"),
					new ValidateItem(_isValidPrice(skuReq), "SKU零售价设置不合法"),
					new ValidateItem(skuReq.getShippingPrice() == null, "SKU运费不合法"),
					new ValidateItem(StringUtils.isBlank(skuReq.getShippingCurrency()), "SKU运费币种不合法")
				);
		}
		return validateItems;
	}

	private boolean _isValidPrice(SkuReq skuReq) {
		return !MoneyUtil.biggerThan(skuReq.getRetailPrice(), skuReq.getOriginalPrice());
	}

	@Override
	protected void completion() {
		_updateCurrency();
		_updateProductPrice();
	}

	private void _updateCurrency() {
		if(CollectionUtils.isEmpty(skus)) {
			return;
		}
		skus.stream().forEach(sku -> {
			sku.setCurrency(bo.getCurrency());
		});
	}

	private void _updateProductPrice() {
		if(CollectionUtils.isEmpty(skus)) {
			return;
		}
		BigDecimal minOriginalPrice = BigDecimal.valueOf(10000000);
		BigDecimal minRetailPrice = BigDecimal.valueOf(10000000);
		for(SkuReq sku : skus) {
			minOriginalPrice = sku.getOriginalPrice().min(minOriginalPrice);
			minRetailPrice = sku.getRetailPrice().min(minRetailPrice);
		}
		Product product = getBo();
		product.setOriginalPrice(minOriginalPrice);
		product.setRetailPrice(minRetailPrice);
	}
}
